#pragma once

#include "Point.h"
#include "btBulletDynamicsCommon.h"


class PointInfo : public Point<int>
{
public:
	PointInfo(void);
	PointInfo(const PointInfo& p);
	~PointInfo(void);

	Point<float> RealCoords;
	bool Removed;

	/** Sprawdza, czy trzy punkty leza na jednej prostej
	* @param p1 Wspolrzedne pierwszego punktu
	* @param p2 Wspolrzedne drugiego punktu
	* @param p3 Wspolrzedne trzeciego punktu
	* @return true - punkty leza na jednej prostej.
	*/
	inline static bool AreColinear(const btVector3& p1, const btVector3& p2, const btVector3& p3)
	{
		btVector3 A(p2 - p1);
		btVector3 B(p3 - p1);

		return A.cross(B).length2() == 0;
	}

	/** Sprawdza, czy trzy punkty leza na jednej prostej
	* @param p1 Wspolrzedne pierwszego punktu
	* @param p2 Wspolrzedne drugiego punktu
	* @param p3 Wspolrzedne trzeciego punktu
	* @return true - punkty leza na jednej prostej.
	*/
	inline static bool AreColinear(const PointInfo& p1, const PointInfo& p2, const PointInfo& p3)
	{
		btVector3 A( p2.X - p1.X, p2.Y - p1.Y, p2.Z - p1.Z);
		btVector3 B( p3.X - p1.X, p3.Y - p1.Y, p3.Z - p1.Z);

		btVector3 cross = A.cross(B);

		if(cross.length2() == 0)
		{
			return true;
		}

		return false;
	}

	/// Operator rownosci.
	virtual bool operator==(const PointInfo& p)
	{
		return this->X == p.X && this->Y == p.Y && this->Z == p.Z;
	}

	/// Operator nierownosci
	virtual bool operator!=(const PointInfo& p)
	{
		return !(*this == p);
	}
	/// Operator mniejszosci.
	virtual bool operator<(const PointInfo& p)
	{
		if(this->X < p.X)
			return true;
		if(this->Y < p.Y)
			return true;
		if(this->Z < p.Z)
			return true;
		return false;
	}

	/// Wypisuje informacje o punkcie na standardowe wyjscie.
	std::string ToString(bool printReal = false) const;
};

